Labortagebuch - Arduino - Raspberry Pi
Processing - Teil 2
27.10.2023 - Processing - Arduino - Bluetooth (HC-05)
Altes und neues Processing-Logo
Processing ist eine objektorientierte, stark typisierte Programmiersprache mit zugehöriger integrierter Entwicklungsumgebung. Die Programmiersprache ist auf die Einsatzbereiche Grafik, Simulation und Animation spezialisiert. Processing wird in einem quelloffenen Projekt entwickelt, das am Massachusetts Institute of Technology von Ben Fry (Broad Institute) und Casey Reas (UCLA Design|Media Arts) initiiert wurde. Processing hat den Charakter einer stark vereinfachten Version der Programmiersprache Java, ermöglicht Interaktionen und visuelle Elemente zu programmieren und richtet sich vorwiegend an Gestalter, Künstler und Programmieranfänger. Die Klassenbibliotheken der Programmiersprache zielen vor allem auf das Einsatzgebiet von Processing ab und berücksichtigen die Themen Video, Grafik, Grafikformate, Sound, Animation, Typographie, 3D, Simulation, Datenzugriff und -transfer, sowie Netzwerkprotokolle. Im Jahr 2005 wurde Processing mit einer Goldenen Nica des Prix Ars Electronica in der Kategorie Net Vision/Net Excellence ausgezeichnet.
(Quelle:https://de.wikipedia.org/wiki/Processing)

Entwicklung der Versionen
Version 1.0 im November 2008
Version 1.5 im April 2011 (Vereinfachte Entwicklungsumgebung für Android-Geräte
Version 2.0 im September 2021 (Große Überarbeitung der gesamten Sprache)
Version 2.1 im Oktober 2013
Version 3.0 im September 2015 (Große Überarbeitung (u.a. Rendering, Editor, Interface))
Zur Zeit (August 2023) liegt Version 4.3 vor in der 64-bit Version für Windows (214 MB), Linux, Mac OS X und Raspberry Pi (32- und 64-Bit Version)
Internetseite: https://processing.org/de/download/
Arduino - Processing

Da die Arduino IDE auf Processing basiert, eignen sich die beiden Programmierumgebungen auch perfekt, um Daten untereinander auszutauschen. Auf der Arduino-Seite nutzt man dazu die Funktion Serial.print(), um Daten an Processing zu schicken und Serial.read(), um Daten von Processing zu empfangen.
Auf Processing-Seite nutzt man die Serial library, die schon in Processing integriert ist. Um Daten vom Arduino in Processing zu empfangen, nutzt man ebenfalls die read()- Funktion und um Daten an das Arduino zu schicken die write()-Funktion.
Neues Processing Logo
1. Mit Processing auf Bluetooth-Modul zugreifen
Der Zugriff auf ein Bluetooth-Modul kann auch mit der Processing-IDE realisiert werden. Wie das im Einzelnen aussieht, soll hier am Beispiel einer LED-Schaltung gezeigt werden. Als Bluetooth-Modul wird der HC-05 bzw. der HC-06 verwendet. Mit zwei Button wird eine LED wahlweise ein- bzw. ausgeschaltet.

Das folgende Beispiel findet man so ähnlich auch auf folgender Seite:
howtomechatronics - arduino - hc-05
Die Verkabelung
Die grafische Oberfläche
In diesem Beispiel ist das Arduino-Uno-Board mit der Arduino-IDE über die USB-Schnittstelle am Raspberry Pi 4 angeschlossen. Das Processing-Programm startet auf einem PC mit Windows 7. Es sind also zwei verschiedene Rechner im Einsatz.

Wenn das Bluetooth-Modul HC-05 zum ersten Mal eingesetzt wird, muss es beim Windows-Rechner angemeldet werden. Der ganze Vorgang ist dann ein wenig umständlich, da der HC-05 beim Hochladen des Arduino-Sketches nicht am Arduino angeschlossen sein darf. Für die Anmeldung am PC dagegen schon.
Also: Die Verkabelung wird wie im Bild durchgeführt, der HC-05 ist angeschlossen.
Man klickt nun mit der linken Maustaste das Bluetooth-Symbol in der Taskleiste an. Im sich öffnenden Fenster wählt man Geräte hinzufügen. Es wird das Bluetooth-Modul HC-05 angezeigt. Für das Passwort nimmt man 1234 oder 0000. Damit ist die Anmeldung fertig.

Wie findet man den Port des angeschlossenen Bluetooth-Moduls?

Über die Bluetooth-Erkennung (Bluetooth-Symbol in der Taskleiste) wird mit der linken Maustaste das Fenster (oberes Bild) geöffnet. In diesem Fenster wird der Menuepunkt Einstellungen öffnen angeklickt und das rechte Fenster öffnet sich. Hier klickt man die Karte COM-Anschlüsse an. Gezeigt werden die belegten COM-Anschlüsse für beide Richtungen (Eingehend und Ausgehend), Für das Processing-Programm merkt man sich in diesem Fall COM9 für Ausgehend.

Der Arduino mit der angeschlossenen LED wird über das USB-Kabel mit einem Raspberry Pi verbunden. Das Bluetooth-Modul HC-05 ist jetzt nicht angeschlossen. Dann wird der Sketch in der Arduino-IDE auf den Mikrocontroller hochgeladen.
Achtung: Der Port ist beim RPi /dev/ttyUSB0. Nach dem Hochladen wird der HC-05 an das Arduino-Board angeschlossen.
Jetzt wird die Processing-IDE gestartet. Hier ist es wichtig, den richtigen Port anzugeben. Diesen erhält man wie oben beschrieben. Der Processing-Code wird hochgeladen und gestartet. Man erhält ein Fenster mit zwei Button:
Turn ON und Turn OFF. Diese können jetzt wahlweise angeklickt werden und die LED verhält sich dann entsprechend.

Arduino Sketch

int ledPin 13;
int state = 0;
void setup() {
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
Serial.begin(9600); }
void loop() {
if(Serial.available() > 0){
// Überprüft ob Daten am seriellen Port vorliegen
state = Serial.read(); // Liest die Daten vom seriellen Port
}
if (state == '0') {
digitalWrite(ledPin, LOW); // Löscht die LED
Serial.println("LED: OFF");
state = 0;}
else if (state == '1') {
digitalWrite(ledPin, HIGH);// Schaltet die LED ein
Serial.println("LED: ON");
state = 0;
} }

Download Programm-Code
Arduino-Sketch (1 kB)

Processing-Code

import processing.serial.*;
Serial myPort;
String ledStatus="LED: OFF";
void setup(){
size(450, 300); myPort = new Serial(this, "COM9", 9600);
// Starts the serial communication
myPort.bufferUntil('\n');
// Defines up to which character the data from the serial port will be read.
//The character '\n' or 'New Line'
}
void serialEvent (Serial myPort){
// Checks for available data in the Serial Port
ledStatus = myPort.readStringUntil('\n');
//Reads the data sent from the Arduino (the String "LED: OFF/ON)
//and it puts into the "ledStatus" variable
}
void draw(){
background(237, 240, 241);
fill(20, 160, 133);
stroke(33);
strokeWeight(1);
rect(50, 100, 150, 50, 10); // Turn ON Button
rect(250, 100, 150, 50, 10); // Turn OFF Button
fill(255);
textSize(32);
text("Turn ON",60, 135);
text("Turn OFF", 255, 135);
textSize(24);
fill(33);
text("Status:", 180, 200);
textSize(30);
textSize(16);
text(ledStatus, 155, 240);
// Prints the string coming from the Arduino
// If the button "Turn ON" is pressed
if(mousePressed && mouseX>50 && mouseX<200 && mouseY>100 && mouseY<150){
myPort.write('1');
// Sends the character '1' and that will turn on the LED
// Highlighs the buttons in red color when pressed
stroke(255,0,0);
strokeWeight(2);
noFill();
rect(50, 100, 150, 50, 10); }
// If the button "Turn OFF" is pressed
if(mousePressed && mouseX>250 && mouseX<400 && mouseY>100 && mouseY<150)
{ myPort.write('0');
// Sends the character '0' and that will turn on the LED
stroke(255,0,0);
strokeWeight(2);
noFill();
rect(250, 100, 150, 50, 10);
} }

Download Programm-Code
Processing-Code (2 kB)
2. Bluetooth + Arduino LED Buttons mit Processing (Folie 1231)
Im folgenden wird wie im vorherigen Beispiel mit Hilfe von 2 Buttons eine LED ein- und ausgeschaltet. Diese Buttons werden jetzt aber mit der Library ControlP5 in Processing erzeugt. Diese Library muss nachträglich eingerichtet werden. Dazu geht man folgendermaßen vor.
In der obersten Menueleiste geht man auf Tools. Es öffnet sich ein Fenster mit den Karten Libraries - Modes - Tools - Examples. Hier wählt man Libraries und scrollt zu ControlP5|A GUI to build custom user interfaces ... Andreas Schlegel. Dieses klickt man an und es erscheint u.a. der Button install. Gleichzeitig wird auch angegeben, um welche Version es sich handelt. Man klickt nun auf install. Damit wird diese Library installiert. (August 2023: Version 2.2.6).

Dieses Beispiel findet man so ähnlich auch auf folgender Seite: Hackster
Auf der folgenden Seite (Bild) gibt es eine ausführliche Darstellung aller möglichen grafischen Elemente mit Beispiel-Code.
Die Seite hat folgende Adresse: http://www.sojamo.de/libraries/controlP5/


Die Library kann auch von der folgenden Seite heruntergeladen werden, als zip-Datei (Dateiname: controlP5-master.zip (1,1MB)).
https://github.com/sojamo/controlp5
Auf der github-Seite sind auch einige Beispiele mit entsprechender Grafik dargestellt.
Die Verkabelung bei diesem Beispiel ist dieselbe wie beim vorangegangenen Beipiel. Die einzelnen Schritte entsprechen sich ebenfalls.
Der Arduino mit der angeschlossenen LED wird über das USB-Kabel mit einem Raspberry Pi verbunden. Das Bluetooth-Modul HC-05 ist jetzt nicht angeschlossen. Dann wird der Sketch in der Arduino-IDE auf den Mikrocontroller hochgeladen.
Achtung: Der Port ist beim RPi /dev/ttyUSB0. Nach dem Hochladen wird der HC-05 an das Arduino-Board angeschlossen.
Jetzt wird die Processing-IDE gestartet. Hier ist es wichtig, den richtigen Port anzugeben. Diesen erhält man wie oben beschrieben. Der Processing-Code wird hochgeladen und gestartet. Man erhält ein Fenster mit zwei Button:
LED ON und LED OFF. Diese können jetzt wahlweise angeklickt werden und die LED verhält sich dann entsprechend.
Zuerst lädt man den Arduino Sketch in der Arduino-IDE auf den Arduino.
Achtung: Der Port muss richtig eingestellt sein und das Board entsprechend gewählt werden. Das Bluetooth-Modul HC-05 darf nicht angschlossen sein.

// Der Arduino-Sketch

String incomingString; // for incoming serial data
int action;
int ledPin=13;
void setup() {
Serial.begin(9600); // opens serial port, sets data rate to 9600 bps
pinMode(ledPin, OUTPUT);}
void loop() { // send data only when you receive data:
if (Serial.available() > 0) {
// read the incoming byte:
incomingString = Serial.readString();
// say what you got:
Serial.print("String received: ");
Serial.println(incomingString);
if (incomingString == "ON")
{ action = 1;}
else if (incomingString == "OFF")
{action = 2;}
else
action = 0;
switch (action) {
case 1:
//do something when var equals 1
Serial.println("Turn ON LED");
digitalWrite(ledPin, HIGH);
break;
case 2:
//do something when var equals 2
Serial.println("Turn OFF LED");
digitalWrite(ledPin, LOW);
break;
default:
// if nothing else matches, do the default
// default is optional
Serial.println("!! Not sure what you want");
break;
} } }

Download Programm-Code
Arduino-Sketch (1 kB)

//Processing-Code

import processing.serial.*;
import controlP5.*;
PFont pfont;
ControlP5 cp5;
Serial myPort;
int myColor = color(0);
void setup() {
size(1024,768);
printArray(Serial.list());
myPort=new Serial(this, "COM3",9600);// Achtung: Port entsprechend ändern
cp5 = new ControlP5(this);
// replace the default controlP5 button with an image.
// button.setImages(defaultImage, rolloverImage, pressedImage);
// use button.updateSize() to adjust the size of the button and
// resize to the dimensions of the defaultImage

cp5.addButton("On")
.setCaptionLabel("LED ON")
.setPosition(175,275)
.setSize(250,200)
.updateSize();

cp5.addButton("Off")
.setCaptionLabel("LED OFF")
.setPosition(475,275)
.setSize(250,200)
.updateSize();

PFont pfont = createFont("Arial",20,true);
ControlFont font = new ControlFont(pfont,241);

cp5.getController("On")
.getCaptionLabel()
.setFont(font)
.toUpperCase(false)
.setSize(38);

cp5.getController("Off")
.getCaptionLabel()
.setFont(font)
.toUpperCase(false)
.setSize(38);
}

void draw() {
background(myColor);
text("LED Control Pad",175,120);
textSize(42);
}
public void controlEvent(ControlEvent theEvent) {
//println(theEvent.getController().getName());
print(theEvent.getController().getLabel());
println(" button has been pressed");
}

void On(){
myPort.write("ON");
println("LED ON");
}

void Off(){
myPort.write("OFF");
println("LED OFF");
}

Download Programm-Code
Processing-Code (1 kB)

3. Steuerung eines 4WD- bzw. 2WD-Cars drahtlos mit Hilfe von Processing


Das nächste Beispiel behandelt die drahtlose Steuerung eines 4WD- bzw. 2WD-Cars mit einer grafischen Oberfläche, die mit Processing programmiert wird. Das Beispiel findet man in wesentlichen Teilen auf folgender Internetseite:
https://www.hackster.io/ahmedibrrahim/how-to-control-2wd-robot-wirelessly-through-processing-0303f0
Als erstes wird der 4WD-Car einfach über die serielle Schnittstelle gesteuert. Das Bluetooth-Modul HC-05 und die grafische Oberfläche, die mit Hilfe der Processing-IDE erstellt wird, kommen erst später dazu.
Also: Als Motortreiber wird der L298N benutzt. Er hat viele Vorteile: ist gut dokumentiert und preiswert. Mit ihm können zwei Gleichstrommotoren getrennt gesteuert werden. Die Verkabelung dafür ist auf folgendem Bild zu sehen:


Hier erkennt man die Anschlüsse des L298N-Motortreibers. Eine sehr ausführliche Darstellung der möglichen Einsätze mit einem Arduino findet man auf folgender Seite:
https://lastminuteengineers.com/l298n-dc-stepper-driver-arduino-tutorial/


Auf diesem Schaltplan sind 2 Motoren angeschlosssen. Wenn man 4 Motoren - auf jeder Seite 2 - steuern will, wird auf jeder Seite jeweils ein weiterer Motor parallel zu den bereits vorhandenen Motoren dazugeschaltet.
Im Einzelnen

1. Der Arduino mit den angeschlossenen Motoren wird über das USB-Kabel mit einem Raspberry Pi verbunden. Das Bluetooth-Modul HC-05 ist noch nicht angeschlossen. Dann wird der Sketch in der Arduino-DIE auf den Mikrocontroller hochgeladen. Achtung: Der Port ist beim RPi /dev/ttyUSB0. Nach dem Hochladen wird der HC-05 an das Arduino-Board angeschlossen.
2. Das Bluetooth-Modul (hier HC-05) muss für den benutzten PC angemeldet werden. Das geschieht, indem man mit linker Maustaste auf das Bluetooth-Symbol geht und Gerät hinzufügen anklickt.
3. Jetzt wird die Processing-IDE gestartet. Hier ist es wichtig, den richtigen Port anzugeben. Diesen erhält man, indem man mit der linken Maustaste auf das Bluetooth-Symbol geht und anklickt. Im sich öffnenden Fenster geht man dann auf Einstellungen öffnen. Im neuen Fenster wird der jeweilige Port (eingehend und ausgehend) für das Bluetooth-Modul HC-05 angezeigt. Diesen Port muss man sich für den Processing-Code merken.
4. Der Processing-Code wird hochgeladen und gestartet. Man erhält das Fenster mit 5 Buttons: FORWARD, LEFT, STOP, RIGHT und BACKWARD. Diese können jetzt wahlweise angeklickt werden und die Motoren drehen sich dann entsprechend. Hier ist der Arduino nicht am Win7-PC angeschlossen. Lediglich das Processing-Programm wird hier ausgeführt und mit Hilfe des Bluetooth HC-05 auf den Arduino zugegriffen. Über den Raspberry Pi wird der Arduino-Sketch auf den Arduino geladen.
Der folgende Arduino-Sketch wird hochgeladen und gestartet. Dazu öffnet man den seriellen Monitor und gibt entsprechend für die jeweiligen Richtungen f (für forward), b (für backward), s (für stop), l (für left) und r (für right) ein.
Der Arduino-Sketch Teil 1

int in1 = 7;
int in2 = 8;
int ENA =9;
int in3=4;
int in4=5;
int ENB=3;
char command;

void setup() {
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(ENA,OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
pinMode(ENB,OUTPUT);
Serial.begin(9600);
}

void forward(){
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
analogWrite(ENA,200);
analogWrite(ENB,200);
}
void stop(){
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
analogWrite(ENA,0);
analogWrite(ENB,0);
}
void backward(){
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
analogWrite(ENA,200);
analogWrite(ENB,200);
}
Der Arduino-Sketch - Teil 2

void left(){
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
analogWrite(ENA,100);
analogWrite(ENB,220);
}
void right(){
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
analogWrite(ENA,220);
analogWrite(ENB,100);
}
void loop(){
if (Serial.available()>0){
command = Serial.read();
switch(command){
case 'f':
forward();
break;
case 'b':
backward();
break;
case 's':
stop();
break;
case 'l':
left();
break;
case 'r':
right();
break;
} // fuer die case-Anweisung
} // fuer die if-Anweisung
} // fuer loop

Download Programm-Code
Arduino-Sketch (2 kB)

Jetzt kommen wir zur Steuerung mit Hilfe der Processing-GUI.

Der Sketch auf dem Arduino bleibt so wie bisher. Das Bluetooth-Modul HC-05 wird jetzt am Arduino verkabelt (siehe Schaltskizze unten).
Auf dem Windows-Rechner wird jetzt die Processing-IDE aufgerufen und der Sketch hochgeladen. Wie oben schon erwähnt, muss man sich den Port des Bluetooth-Moduls beschaffen und diesen in den Processing-Code einfügen bzw. verändern. Wie man den Port erhält, wurde schon oben beschrieben (im unteren Bild noch einmal zusammengestellt).




Der Processing-Code Teil 1

import controlP5.*; //import ControlP5 library
import processing.serial.*; //import the Serial Library
PFont font; //do not change
PFont font1;
ControlP5 cp5; //create ControlP5 object
Serial port;
//create Serial object
void setup() {
size(500, 300);
cp5 = new ControlP5(this);
port = new Serial(this, "COM9", 9600);
font = createFont("verdana", 18); //font for buttons and title
font1 = createFont("Arial", 25); //font for buttons and title
cp5.addButton("forward")
.setFont(font) //font
.setPosition(190, 50)
.setSize(120, 70)
.setColorForeground(color(255,140,0))
.setColorBackground(color(102,102,0))
;
cp5.addButton("backward")
.setFont(font) //font
.setPosition(190, 210)
.setSize(120, 70)
.setColorForeground(color(255,140,0))
.setColorBackground(color(102,102,0))
;
cp5.addButton("right")
.setFont(font) //font
.setPosition(350, 130)
.setSize(120, 70)
.setColorForeground(color(255,140,0))
.setColorBackground(color(102,102,0))
;
Der Processing-Code Teil 2

cp5.addButton("left")
.setFont(font) //font
.setPosition(30, 130)
.setSize(120, 70)
.setColorForeground(color(255,140,0))
.setColorBackground(color(102,102,0))
;
cp5.addButton("stop")
.setFont(font) //font
.setPosition(190, 130)
.setSize(120, 70)
.setColorForeground(color(255,140,0))
.setColorBackground(color(102,102,0))
;
}
void draw() {
background(150, 190, 150);
fill(255);
textFont(font1);
text("Motor Control GUI", 160, 30);
}
void forward() {port.write('f');}
void backward() {port.write('b');}
void right() {port.write('r');}
void left() {port.write('l');}
void stop() {port.write('s');}

Download Programm-Code
Arduino-Sketch (2 kB)



So sieht die grafische Oberfläche für die Steuerung des 4WD-Cars mit der Processing-IDE programmiert aus. Die Befehle sind selbsterklärend. Die Buttons können entsprechend den eigenen Wünschen sowohl in der Art der Schriftart als auch in der Farbgebung verändert werden.


So oder ähnlich kann das fertige 4WD-Car aussehen. Die Hardware kann bei Amazon bestellt werden. Ein preisgünstiges Set ist EMOZNY 4 Wheel 2 Layer Robot Smart Car Chassis Kits with Speed Encoder for Arduino DIY. Dieses wird z.Zt. für 15,51 Euro angeboten (Oktober 2023).